package com.snowRemovingUser.util;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;


@Component
public class SftpTransfer {

    /** log */
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${linux.ip}")
    private String remoteHost1; // 测试服务器

    @Value("${linux.username}")
    private String username1; // 测试服务器的用户名

    @Value("${linux.password}")
    private String password1; // 测试服务器的密码

    @Value("${linux.remoteFilePath}")
    private String sourceFilePath; // 在测试服务器下载文件路径

    @Value("${formalAttire.ip}")
    private String remoteHost2; // 正式服务器

    @Value("${formalAttire.username}")
    private String username2; // 正式服务器的用户名

    @Value("${formalAttire.password}")
    private String password2; // 正式服务器的密码

    @Value("${formalAttire.destinationFilePath}")
    private String destinationFilePath; // 在正式服务器下载文件路径

    int remotePort = 22;// 远程服务器的端口号(默认为22)

    public  Boolean  fileTransfer(String fileName){

        // 创建JSch对象
        JSch jsch = new JSch();
        // 连接到测试服务器
        try {
            Session session1 = jsch.getSession(username1, remoteHost1, remotePort);
            session1.setPassword(password1);
            session1.setConfig("StrictHostKeyChecking", "no");
            session1.connect();

            // 创建SFTP通道
            ChannelSftp sftpChannel1 = (ChannelSftp) session1.openChannel("sftp");
            sftpChannel1.connect();

            // 从测试服务器下载文件
            InputStream inputStream = sftpChannel1.get(sourceFilePath+fileName);

            // 连接到正式服务器
            Session session2 = jsch.getSession(username2, remoteHost2, remotePort);
            session2.setPassword(password2);
            session2.setConfig("StrictHostKeyChecking", "no");
            session2.connect();

            // 创建SFTP通道
            ChannelSftp sftpChannel2 = (ChannelSftp) session2.openChannel("sftp");
            sftpChannel2.connect();

            // 在正式服务器上传文件
            sftpChannel2.put(inputStream, destinationFilePath+fileName);

            // 关闭通道和会话
            sftpChannel1.disconnect();
            sftpChannel2.disconnect();
            session1.disconnect();
            session2.disconnect();

            logger.info("文件传输成功");

            return true;

        } catch (Exception e) {

            logger.error("文件传输失败",e.getMessage());

            return false;

        }

    }
}
